#include <sw/redis++/redis.h>
#include <gflags/gflags.h>
#include <iostream>
#include <thread>

DEFINE_string(ip, "127.0.0.1", "这是服务器的监听IP地址, 格式: 127.0.0.1");
DEFINE_int32(port, 6379, "这是服务器的监听端口, 格式: 6379");
DEFINE_int32(db, 0, "库的编号, 默认0号");
DEFINE_bool(keep_alive, true, "是否开启长连接, 默认开启");

void print(sw::redis::Redis& client)
{
    auto user1 = client.get("会话ID1");
    if(user1) std::cout << "user1: " << *user1 << std::endl;
    auto user2 = client.get("会话ID2");
    if(user2) std::cout << "user2: " << *user2 << std::endl;
    auto user3 = client.get("会话ID3");
    if(user3) std::cout << "user3: " << *user3 << std::endl;
    auto user4 = client.get("会话ID4");
    if(user4) std::cout << "user4: " << *user4 << std::endl;
    auto user5 = client.get("会话ID5");
    if(user5) std::cout << "user5: " << *user5 << std::endl;
}

void string_test(sw::redis::Redis& client)
{
    std::cout << "--------------测试string--------------" << std::endl;
    client.set("会话ID1", "用户ID1");
    client.set("会话ID2", "用户ID2");
    client.set("会话ID3", "用户ID3");
    client.set("会话ID4", "用户ID4");
    client.set("会话ID5", "用户ID5");

    client.del("会话ID3");

    client.set("会话ID5", "用户ID5555"); // 修改键值对

    print(client);
}

void expired_test(sw::redis::Redis& client)
{
    std::cout << "--------------测试expired--------------" << std::endl;
    client.set("会话ID1", "用户ID11111", std::chrono::milliseconds(1000));
    print(client);
    std::cout << "等待2秒......" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(2));
    print(client);
}

void list_test(sw::redis::Redis& client)
{
    std::cout << "--------------测试list--------------" << std::endl;
    // 先删除群聊1列表
    client.del("群聊1");
    // 再添加成员
    client.rpush("群聊1", "成员1");
    client.rpush("群聊1", "成员2");
    client.rpush("群聊1", "成员3");
    client.rpush("群聊1", "成员4");
    client.rpush("群聊1", "成员5");

    std::vector<std::string> users;
    client.lrange("群聊1", 0, -1, std::back_inserter(users));

    for(auto& user : users)
    {
        std::cout << user << std::endl;
    }
}

int main(int argc, char* argv[])
{
    // 功能接口演示：
    // 1.构造连接选项，创建Redis对象，连接服务器
    sw::redis::ConnectionOptions opts;
    opts.host = FLAGS_ip;
    opts.port = FLAGS_port;
    opts.db = FLAGS_db;
    opts.keep_alive = FLAGS_keep_alive;
    sw::redis::Redis client(opts);
    // 2.添加字符串键值对，删除键值对，获取键值对
    string_test(client);
    // 3.实践设置键值过期时间的操作
    expired_test(client);
    // 4.添加列表元素，获取列表元素，删除列表元素
    list_test(client);

    return 0;
}